package appvideo.persistencia;


import appvideo.logica.Empleado;
import appvideo.logica.Salario;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


//Devuelve todos los empleados de la base de datos
public class Persistencia_Empleados {
    
    
    //Me devuelve todos los empleados de la base de datos
    public static List<Empleado> getEmpleados(){
        List<Empleado> emps=new ArrayList();
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        try {
            st = con.createStatement();
            //Esta consulta coge todos los datos necesarios para crear el empleado y su salario de la base de datos
            rs = st.executeQuery("Select nombre,apellidos,dni,password,email,tlf,fecha_alta,horas_trab,precio_hora"
                    + " FROM personas INNER JOIN salarios ON personas.id=salarios.id_emp WHERE personas.tipo=2 AND personas.estado=1;");
            
            while(rs.next()){
                Salario s = new Salario(rs.getInt("horas_trab"),rs.getFloat("precio_hora"));
                Empleado e = new Empleado(rs.getString("nombre"),rs.getString("apellidos"),rs.getString("dni"),
                        rs.getString("email"),rs.getInt("tlf"),s,rs.getDate("fecha_alta"),rs.getString("password"));
                emps.add(e);
            }
            
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally{
            try {
                rs.close();
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }  catch(Exception e){
                System.out.println(e.getMessage());
            } 
        }
        
        
        return emps;
    }
    //Devuelve un empleado o nulo si no existe
    public static Empleado buscaEmpleado(String dni){
        Empleado e=null;
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        
        try{
            st = con.createStatement();
            //Atencion: Devuelve los empleados con salario que estan dados de alta(estado=1) o baja(estado=2)
            rs = st.executeQuery("Select personas.id,nombre,apellidos,dni,password,email,tlf,fecha_alta,horas_trab,precio_hora"
                    + " FROM personas INNER JOIN salarios ON personas.id=salarios.id_emp "
                    + "WHERE personas.dni='"+dni+"' AND personas.tipo=2");
            if(rs.next()){
                Salario s = new Salario(rs.getInt("horas_trab"),rs.getFloat("precio_hora"));
                e = new Empleado(rs.getInt("id"),rs.getString("nombre"),rs.getString("apellidos"),rs.getString("dni"),
                        rs.getString("email"),rs.getInt("tlf"),s,rs.getDate("fecha_alta"),rs.getString("password"));
            }
        }catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } catch(Exception ex){
            System.out.println(ex.getMessage());
        }finally{
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            } 
        }
        
        return e;
    }
    //Inserta o actualiza a un empleado de la base de datos
    public static boolean altaEmpleado(Empleado e){
        boolean ret=false;
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        try {
                st=con.createStatement();
                //Comprobar si empleado esta en la base de datos
                rs = st.executeQuery("SELECT COUNT(0) FROM personas "
                        + "WHERE personas.dni = '"+e.getDni()+"' AND personas.tipo=2 "); 
                rs.next();
                if(rs.getInt(1)==1){
                    //El empleado estaba dado de alta en la base de datos.
                    //HACER UPDATE DEL EMPLEADO
                    st.executeUpdate("UPDATE personas SET estado = 1 WHERE personas.tipo=2 AND personas.dni='"+e.getDni()+"'");
                    ret = true;
                }else if(rs.getInt(1)==0){
                    //El empleado no existe en la base de datos
                    //HACER INSERCION DE SALARIO Y EMPLEADO
                    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                    
                    
                    //INSERCION EMPLEADO
                    st.executeUpdate("INSERT INTO personas (dni,nombre,apellidos,tlf,email,fecha_alta,tipo,estado) "
                            + "VALUES ('"+e.getDni()+"','"+e.getNombre()+"','"+e.getApellidos()+"',"+e.getTlf()+",'"+e.getEmail()+"','"+dt.format(e.getfAlta())+"',2,1)");
                    //CONSULTA PROXIMO ID A INSERTAR(Llevar control del id en las dos tablas que inserto al mismo tiempo)
                    rs = st.executeQuery("SELECT MAX(id) FROM PERSONAS");
                    rs.next();
                    int id_emp = rs.getInt(1); 
                    //INSERCION SALARIO
                    st.executeUpdate("INSERT INTO salarios (id_emp,precio_hora,horas_trab,fecha_ult_actualizacion,salario_bruto_mensual) "
                            + "VALUES ('"+id_emp+"','"+e.getSalario().getPrecioHora()+"','"+e.getSalario().getHorasTrabajadas()+"','"+dt.format(new Date())+"',"+e.getSalario().getSalarioBrutoMensual()+")");
                    
                    ret = true;
                }else{
                    System.out.println("Empleado con DNI duplicado en la Base de Datos.");
                }
                
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            } finally {
                try {
                    rs.close();
                    st.close();
                    con.close();
                }catch (SQLException sqlex) {
                    System.out.println(sqlex.getMessage());
                }catch(Exception ex){
                    System.out.println(ex.getMessage());
                }
            }
            
        
        return ret;
    }
    //Da de baja a un empleado en la base de datos(cambia su estado a 2)
    public static boolean bajaEmpleado(Empleado e){
        boolean ret=false;
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
       
        try {
            st = con.createStatement();
            //Comprobar si el empleado esta en la base de datos
            rs = st.executeQuery("SELECT COUNT(0) FROM personas "
                        + "WHERE personas.dni = '"+e.getDni()+"' AND personas.tipo=2 ");
            rs.next();
            if(rs.getInt(1)==1){
                //Si existe un empleado en la base de datos->Dale de baja
                st.executeUpdate("UPDATE personas SET estado = 2 WHERE personas.tipo=2 AND personas.dni='"+e.getDni()+"'");
                ret=true;
            }else if(rs.getInt(1)==2){
                System.out.println("Empleado con DNI duplicado en la Base de Datos");
            }
                
        } catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } catch (Exception ex){
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        return ret;
    }
    
    public static boolean modificaEmpleado(Empleado e){
        boolean ret=false;
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        
        try {
            st = con.createStatement();
            //Comprobar si el empleado esta en la base de datos
            rs = st.executeQuery("SELECT COUNT(0) FROM personas "
                        + "WHERE personas.id = '"+e.getId()+"' AND personas.tipo=2 ");
            rs.next();
            if(rs.getInt(1)==1){
                SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                //Si existe un empleado en la base de datos->Dale de baja
                st.executeUpdate("UPDATE personas "
                        + "SET nombre='"+e.getNombre()+"', apellidos='"+e.getApellidos()+"', dni='"+e.getDni()+"',email='"+e.getEmail()+"',tlf="+e.getTlf()+", fecha_alta='"+dt.format(e.getfAlta())+"'"
                        + " WHERE personas.tipo=2 AND personas.id="+e.getId()+"");
                ret=true;
            }else if(rs.getInt(1)==2){
                System.out.println("Empleado con DNI duplicado en la Base de Datos");
            }
            
        }catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        return ret;
    }
}
